import pandas as pd
from pyecharts import options as opts
from pyecharts.charts import Bar, Timeline
import re

# 读取数据
df = pd.read_csv('dalian_weather_2025.csv', encoding='utf-8')

# 自定义解析函数
def custom_date_parser(date_str):
    # 使用正则表达式去除中文星期几
    date_str = re.sub(r'星期[一二三四五六日]', '', date_str)
    return pd.to_datetime(date_str)

# 应用自定义解析函数
df['日期'] = df['日期'].apply(custom_date_parser)

# 提取年、月、日
df['year'] = df['日期'].dt.year
df['month'] = df['日期'].dt.month
df['day'] = df['日期'].dt.day

# 确保最高气温和最低气温是整数
for col in ['最高气温', '最低气温']:
    df[col] = df[col].str.replace('℃', '').str.strip().astype(int)
print(df)
# 创建时间线
timeline = Timeline()
timeline.add_schema(play_interval=1000)

# 按月份分组
monthly_groups = df.groupby(['year', 'month'])

# 遍历每个月的数据
for (year, month), group in monthly_groups:
    month_str = f"{year}-{month:02d}"

    # 创建双柱状图
    bar = Bar()
    bar.add_xaxis(group['日期'].dt.strftime('%Y-%m-%d').tolist())
    bar.add_yaxis("最高气温", group['最高气温'].tolist(), category_gap="50%")
    bar.add_yaxis("最低气温", group['最低气温'].tolist(), category_gap="50%")

    # 设置系列配置项
    bar.set_series_opts(
        label_opts=opts.LabelOpts(is_show=True),
        itemstyle_opts={
            "normal": {
                "color": lambda params: "#c23531" if params.name == "最高气温" else "#2f4554"
            }
        },
    )

    # 设置全局配置项
    bar.set_global_opts(
        title_opts=opts.TitleOpts(title=f"大连{month_str}最高最低气温"),
        tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="shadow"),
        legend_opts=opts.LegendOpts(pos_bottom="1%"),
    )



    # 将复合图表添加到时间线
    timeline.add(bar, month_str)

# 保存为HTML文件
timeline.render('monthly_daily_temperatures_bar.html')
